﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Text;
using System.Windows.Forms;
using CRC.Inspecciones.Dominio.Clases;
using CRC.Inspecciones.Dominio.Controlador;
using System.IO;
using System.Reflection;
using CRC.GestionSalones.Dominio.Clases;
using NHibernate;
using mshtml;

namespace CRC.Inspecciones.Presentacion
{
    public partial class FrmImpreso : System.Windows.Forms.Form
    {
        private int _iImpreso;
        private Impreso _impreso;
        private CtrlImpreso _ctrlImpreso;
        private static String _sHtmlCargando = "<html><head><title></title></head><body>Espera por favor. Cargando impreso ...</body></html>";

        private StringBuilder _sHTMLDinamico = new StringBuilder();
        
        private FrmImpreso()
        {
            InitializeComponent();

        }

        public FrmImpreso(int piImpreso) : this() 
        {
            _iImpreso = piImpreso;
        }

        private void FrmImpreso_Load(object sender, EventArgs e)
        {
            CargarImpreso();
        }

        #region " Cargar impreso"

        private void CargarImpreso() { 
            
            toolStripStatusLabel1.Text = "Espera por favor. Cargando impreso ...";
            this.Text = "Espera por favor. Cargando impreso ...";

            webBrowser1.DocumentText = _sHtmlCargando;
            butGuardarBorrador.Enabled = false;
            ChkBorrador.Enabled = false;
            TxtCiudad.Enabled = false;
            TxtCongAnfitriona.Enabled = false;
            TxtCongsAsistentes.Enabled = false;
            TxtFirmasInspeccion.Enabled = false;
            TxtNumCong.Enabled = false;
            TxtProvincia.Enabled = false;

            FechaInspeccionNula.Enabled = false;
            FechaSolucionNula.Enabled = false;
            TxtFirmaCoordMant.Enabled = false;
            TxtFirmasInspeccion.Enabled = false;

            backgroundWorker_Cargar.RunWorkerAsync();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            _ctrlImpreso = new CtrlImpreso();
            _impreso = _ctrlImpreso.obtenerImpreso(_iImpreso, _sHTMLDinamico);
            e.Result = _impreso;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            try {
                if (e.Error == null)
                {
                    LlenarDocumento();
                }
                else {
                    toolStripStatusLabel1.Text = "Error: " + e.Error.Message;
                    MessageBox.Show(e.Error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
            finally {

                toolStripStatusLabel1.Text = String.Empty;
                butGuardarBorrador.Enabled = true;
                ChkBorrador.Enabled = true;
                TxtCiudad.Enabled = true;
                TxtCongAnfitriona.Enabled = true;
                TxtCongsAsistentes.Enabled = true;
                TxtFirmasInspeccion.Enabled = true;
                TxtNumCong.Enabled = true;
                TxtProvincia.Enabled = true;
                FechaInspeccionNula.Enabled = true;
                FechaSolucionNula.Enabled = true;
                TxtFirmaCoordMant.Enabled = true;
                TxtFirmasInspeccion.Enabled = true;
            }
        }

        /// <summary>
        /// Llenar datos fijos del formulario: cong. anfitriona, num, poblacion, ...
        /// </summary>
        private void LlenarDocumento() {
            try
            {

                this.Text = _impreso.Tipo.Descripcion;

                Salon sal = _impreso.SalonInspeccionado;
                TxtCongAnfitriona.Text = sal.Anfitriona().NombreCRC;
                TxtNumCong.Text = sal.Anfitriona().Numero.ToString();
                TxtCiudad.Text = sal.Municipio.Nombre1;
                TxtProvincia.Text = sal.Municipio.Provincia.Nombre;
                ChkBorrador.Checked = _impreso.EsBorrador;
                foreach (Congregacion c in sal.Asistentes)
                {
                    TxtCongsAsistentes.Text += c.NombreCRC + ", " ;
                }
                TxtCongsAsistentes.Text = TxtCongsAsistentes.Text.Remove(TxtCongsAsistentes.Text.LastIndexOf(","), 2);

                DateTime vFechaInsp, vFechaSol;
                
                //if (DateTime.TryParse(_impreso.FechaInspeccion, out vFechaInsp)) FechaInspeccion.Value = vFechaInsp;
                //if (DateTime.TryParse(_impreso.FechaSolucion, out vFechaSol)) FechaSolucion.Value = vFechaSol;

                if (String.IsNullOrEmpty(_impreso.FechaSolucion)) { FechaSolucionNula.Text = String.Empty; }
                else { if (DateTime.TryParse(_impreso.FechaSolucion, out vFechaSol)) FechaSolucionNula.Text = vFechaSol.ToShortDateString(); }

                if (String.IsNullOrEmpty(_impreso.FechaInspeccion)) { FechaInspeccionNula.Text = String.Empty; }
                else { if (DateTime.TryParse(_impreso.FechaInspeccion, out vFechaInsp)) FechaInspeccionNula.Text = vFechaInsp.ToShortDateString(); }
                

                TxtFirmasInspeccion.Text = _impreso.FirmaInspector;
                TxtFirmaCoordMant.Text = _impreso.FirmaCoordinador;

                EscribirHTML();
            }
            catch (Exception ex) {
                MessageBox.Show("Error al cargar los datos del salon: " + ex.Message , 
                    "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
        }

        /// <summary>
        /// webBrowser.DocumentText <- plantilla_impreso.txt
        /// </summary>
        private void EscribirHTML() { 

            Stream inFile = Assembly.GetExecutingAssembly().GetManifestResourceStream("CRC.Inspecciones.Dominio.Clases.plantilla_impreso.txt");
            if (inFile.Length == 0) throw new Exception("No se puede mostrar el impreso: plantilla vacia.");
            Byte[] buf = new Byte[inFile.Length];
            inFile.Read(buf, 0, buf.Length);
            String textoPlantilla = System.Text.UnicodeEncoding.Unicode.GetString(buf);
            webBrowser1.DocumentText = textoPlantilla.Replace("#CONTENIDO#", _sHTMLDinamico.ToString());
        }
        #endregion

        #region " Guardar impreso "

            private void butGuardarBorrador_Click(object sender, EventArgs e)
            {
                    toolStripStatusLabel1.Text = "Guardando. Espere, por favor.";
                    butGuardarBorrador.Enabled = false;
                    ChkBorrador.Enabled = false;
                    TxtCiudad.Enabled = false;
                    TxtCongAnfitriona.Enabled = false;
                    TxtCongsAsistentes.Enabled = false;
                    TxtFirmasInspeccion.Enabled = false;
                    TxtNumCong.Enabled = false;
                    TxtProvincia.Enabled = false;

                    FechaInspeccionNula.Enabled = false;
                    FechaSolucionNula.Enabled = false;
                    TxtFirmaCoordMant.Enabled = false;
                    TxtFirmasInspeccion.Enabled = false;

                    DateTime dataInsp;
                    //if (FechaInspeccionNula.Text.Length == 0) { dataInsp = DateTime.MinValue; }
                    //else { dataInsp = DateTime.Parse(FechaInspeccionNula.Text); }

                    if (!DateTime.TryParse(FechaInspeccionNula.Text, out dataInsp))
                    {
                        dataInsp = DateTime.MinValue;
                    }

                    DateTime dataSol;
                    //if (FechaSolucionNula.Text.Length == 0) { dataSol = DateTime.MinValue; }
                    //else { dataSol = DateTime.Parse(FechaSolucionNula.Text); }

                    if (!DateTime.TryParse(FechaSolucionNula.Text, out dataSol))
                    {
                        dataSol = DateTime.MinValue;
                    }

                    Object[] args = new Object[] { 
                        ChkBorrador.Checked, 
                        dataInsp, 
                        dataSol,
                        TxtFirmasInspeccion.Text,
                        TxtFirmaCoordMant.Text,
                        webBrowser1.Document};

                    backgroundWorker_Guardar.RunWorkerAsync(args);

            }
            
            private void backgroundWorker_Guardar_DoWork(object sender, DoWorkEventArgs e)
            {
                Object[] args = (Object[])e.Argument;

                _ctrlImpreso.guardarImpreso(_impreso,
                        (Boolean)args[0],
                        (DateTime)args[1],
                        (DateTime)args[2],
                        (String)args[3],
                        (String)args[4],
                        (HtmlDocument)args[5]);

            }

            private void backgroundWorker_Guardar_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
            {

                try { 
                
                    if (e.Error == null)
                    {
                        toolStripStatusLabel1.Text = "Impreso guardado correctamente";
                        MessageBox.Show("Impreso guardado correctamente", "Informacion", MessageBoxButtons.OK, MessageBoxIcon.Information);

                    }
                    else {
                        toolStripStatusLabel1.Text = "Error: " + e.Error.Message;
                        MessageBox.Show(e.Error.Message, "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                
                    }

                } finally {

                    butGuardarBorrador.Enabled = true;
                    ChkBorrador.Enabled = true;
                    TxtCiudad.Enabled = true;
                    TxtCongAnfitriona.Enabled = true;
                    TxtCongsAsistentes.Enabled = true;
                    TxtFirmasInspeccion.Enabled = true;
                    TxtNumCong.Enabled = true;
                    TxtProvincia.Enabled = true;

                    FechaInspeccionNula.Enabled = true;
                    FechaSolucionNula.Enabled = true;
                    TxtFirmaCoordMant.Enabled = true;
                    TxtFirmasInspeccion.Enabled = true;
                }
                
            }

        #endregion
    }
}
